﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using GigaSite.Domain.Entities;
using GigaSite.Domain.Enums;
using GigaSite.Domain.Interfaces.Repositories;
using GigaSite.Domain.IoC;
using GigaSite.Web.Areas.Catalog.Models;
using GigaSite.Web.Classes;
using GigaSite.Web.Controllers;

namespace GigaSite.Web.Areas.Catalog.Controllers
{
    /// <summary>
    /// Контроллер по управлению вакансиями и резюме
    /// </summary>
    public class JobsController : BaseController
    {
        /// <summary>
        /// Отображает главную страницу раздела работы
        /// </summary>
        /// <returns></returns>
        public ActionResult Index()
        {
            return RedirectToAction("Vacancies");
        }

        #region Вакансии

        /// <summary>
        /// Отображает список вакансий в указанной категории либо список корневых категорий вакансий
        /// </summary>
        /// <param name="id">Идентификатор категории, может быть null</param>
        /// <returns>Страница со списком категорий или страница со списком вакансий в указанной категории</returns>
        public ActionResult Vacancies(long? id)
        {
            // Навигационная цепочка
            AddNavigationItem("Работа",Url.Action("Index"));
            AddNavigationItem("Вакансии",Url.Action("Vacancies",new {id = new Nullable<long>()}));

            // Репозитории
            var repository = Locator.GetService<IVacanciesRepository>();
            var categoriesRepository = Locator.GetService<ICategoriesRepository>();

            // Имя вью который отображаем
            string viewName = "VacancyCategories";
            ViewBag.categoryUrlFormat = Url.Action("Vacancies", new { id = new Nullable<int>() }) + "/{0}";
            Func<Category, int> itemsCountSelector = repository.GetVacanciesCountInCategoryAndChildCategories;
            ViewBag.itemsCountSelector = itemsCountSelector;
            ViewBag.titleImg = Url.Content("~/Content/images/top/estate.png");
            Category category = null;

            // В зависимости от параметров запроса
            if (!id.HasValue)
            {
                // Отображаем категории
                category = categoriesRepository.Load(CategoryManager.JobsCategory);
                viewName = "VacancyCategories";
            }
            else
            {
                // Загружаем категорию
                category = categoriesRepository.Load(id.Value);
                if (category == null)
                {
                    return View("CategoryNotFound", id);
                }

                // Формирует навигационную цепочку
                foreach (var parent in category.GetParentCategories().Skip(2))
                {
                    AddNavigationItem(parent.DisplayName, Url.Action("Vacancies", new { id = parent.Id }));
                }
                AddNavigationItem(category.DisplayName, String.Empty, true);

                // Присваиваем тип вью
                viewName = "VacancyList";
            }

            // Отдаем основные данные во вью
            ViewBag.category = category;
            return View(viewName);
        }

        /// <summary>
        /// Отдает контрол содержащий вид вакансий с указанной категорией
        /// </summary>
        /// <param name="categoryId">Идентификатор категории</param>
        /// <param name="page">Номер страницы</param>
        /// <param name="itemsPerPage">Количество вакансий на страницу</param>
        /// <returns></returns>
        public ActionResult VacanciesView(long categoryId, int page = 0, int itemsPerPage = 50)
        {
            // Репозитории
            var repository = Locator.GetService<IVacanciesRepository>();
            var categoriesRepository = Locator.GetService<ICategoriesRepository>();

            // загружаем указанную категорию
            var category = categoriesRepository.Load(categoryId);
            if (category == null)
            {
                return Content(String.Format("Категория с идентификатором {0} не найдена", categoryId));
            }

            // Узнаем количество объявлений в указанной категории
            var vacCount = repository.GetVacanciesCountInCategoryAndChildCategories(category);

            // Отдаем данные во вью
            ViewBag.category = category;
            ViewBag.page = page;
            ViewBag.itemsPerPage = itemsPerPage;
            ViewBag.vacCount = vacCount;

            // Отдаем сам вью
            return PartialView();
        }

        /// <summary>
        /// Отдает сам контрол со списком вакансий
        /// </summary>
        /// <param name="categoryId">Идентификатор категории</param>
        /// <param name="page">Текущая страница</param>
        /// <param name="itemsPerPage">Количество вакансий на страницу</param>
        /// <returns>Контрол с вакансиями</returns>
        public ActionResult GetVacancies(long categoryId, int page, int itemsPerPage)
        {
            // Репозитории
            var repository = Locator.GetService<IVacanciesRepository>();
            var categoriesRepository = Locator.GetService<ICategoriesRepository>();

            // загружаем указанную категорию
            var category = categoriesRepository.Load(categoryId);
            if (category == null)
            {
                return Content(String.Format("Категория с идентификатором {0} не найдена", categoryId));
            }

            // получаем указанные объявления
            var dbVacs = repository.GetVacanciesInCategoryAndChildCategories(category).Where(a => a.Status == VacancyStatus.Active).OrderByDescending(a => a.Sticked).ThenByDescending(a => a.DateCreated).ThenBy(a => a.DateModified).Skip(page * itemsPerPage).Take(itemsPerPage);

            // Преобразуем в модели
            var vacs = dbVacs.Select(v => new VacancyListItemModel(v));

            // Отдаем сам вью
            return PartialView(vacs);
        }

        #endregion
    }
}
